]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/brightness: Switch to the new BrightnessManager
authorSebastian Wick <sebastian.wick@redhat.com>
Sat, 21 Jun 2025 22:17:11 +0000 (00:17 +0200)
committerSebastian Wick <sebastian.wick@redhat.com>
Sun, 3 Aug 2025 01:34:28 +0000 (03:34 +0200)
Instead of looking at the monitor backlights directly, connect to the
BrightnessManager global scales. Everything should continue working as
before, this simply gives the BrightnessManager control over the actual
backlight with the quick settings brightness sliders being one input.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3751>

js/ui/status/brightness.js

index d1642f109ca22c60a7102e342e46a074b27253f5..768186af37cc8ff721e87a2dc0cf425084a725a4 100644 (file)
@@ -1,6 +1,9 @@
 import GObject from 'gi://GObject';
 
 import {QuickSlider, SystemIndicator} from '../quickSettings.js';
+import * as Main from '../main.js';
+
+const BRIGHTNESS_NAME = _('Brightness');
 
 const BrightnessItem = GObject.registerClass(
 class BrightnessItem extends QuickSlider {
@@ -9,70 +12,41 @@ class BrightnessItem extends QuickSlider {
             iconName: 'display-brightness-symbolic',
         });
 
-        this.slider.accessible_name = _('Brightness');
-
-        const monitorManager = global.backend.get_monitor_manager();
-        monitorManager.connectObject('monitors-changed',
-            this._monitorsChanged.bind(this), this);
-        this._monitorsChanged();
-
-        this._sliderChangedId = this.slider.connect('notify::value',
-            this._sliderChanged.bind(this));
-    }
-
-    _sliderChanged() {
-        this._setBrightness(this.slider.value);
-    }
+        this.slider.accessible_name = BRIGHTNESS_NAME;
 
-    _changeSlider(value) {
-        this.slider.block_signal_handler(this._sliderChangedId);
-        this.slider.value = value;
-        this.slider.unblock_signal_handler(this._sliderChangedId);
+        this._manager = Main.brightnessManager;
+        this._manager.connectObject('changed',
+            this._sync.bind(this), this);
+        this._sync();
     }
 
-    _setBrightness(brightness) {
-        this._primaryBacklight?.block_signal_handler(this._brightnessChangedId);
-        this._monitors.forEach(monitor => {
-            const backlight = monitor.get_backlight();
-            const {brightnessMin: min, brightnessMax: max} = backlight;
-            backlight.brightness = min + ((max - min) * brightness);
+    _sync() {
+        const {globalScale} = this._manager;
+        this.set({
+            visible: !!globalScale,
         });
-        this._primaryBacklight?.unblock_signal_handler(this._brightnessChangedId);
 
-        this._changeSlider(brightness);
-    }
+        if (!this.visible)
+            return;
 
-    _primaryBacklightChanged() {
-        const {brightness, brightnessMin: min, brightnessMax: max} =
-            this._primaryBacklight;
-        const target = (brightness - min) / (max - min);
-        this._setBrightness(target);
+        this._connectSlider(this.slider, globalScale);
     }
 
-    _setPrimaryBacklight(backlight) {
-        if (this._primaryBacklight) {
-            this._primaryBacklight.disconnect(this._brightnessChangedId);
-            this._brightnessChangedId = 0;
-        }
-
-        this._primaryBacklight = backlight;
-        this.visible = !!backlight;
-
-        if (this._primaryBacklight) {
-            this._brightnessChangedId =
-                this._primaryBacklight.connect('notify::brightness',
-                    this._primaryBacklightChanged.bind(this));
-            this._primaryBacklightChanged();
-        }
-    }
+    _connectSlider(slider, scale) {
+        slider.disconnectObject(scale);
+        slider.connectObject('notify::value', () => {
+            if (slider._blockBrightnessAdjust)
+                return;
+            scale.value = slider.value;
+        }, scale);
 
-    _monitorsChanged() {
-        this._monitors = global.backend.get_monitor_manager()
-            .get_monitors()
-            .filter(m => m.get_backlight() && m.is_active());
-        const primary = this._monitors.find(m => m.is_primary()) ||
-                        this._monitors[0];
-        this._setPrimaryBacklight(primary?.get_backlight());
+        const changeBrightness = () => {
+            slider._blockBrightnessAdjust = true;
+            slider.value = scale.value;
+            slider._blockBrightnessAdjust = false;
+        };
+        scale.connectObject('notify::value', changeBrightness, slider);
+        changeBrightness();
     }
 });